﻿///////////////////////////////////////////////////////////////////////////////////////////////////////
// Copyright (c) 2023, ООО 1С-Софт
// Все права защищены. Эта программа и сопроводительные материалы предоставляются 
// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0)
// Текст лицензии доступен по ссылке:
// https://creativecommons.org/licenses/by/4.0/legalcode
///////////////////////////////////////////////////////////////////////////////////////////////////////

#Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда

#Область СлужебныеПроцедурыИФункции

// Возвращаемое значение:
//  Структура:
//   * ПравилоСтрока - Строка
//   * ПравилоДата - Строка
//   * ПравилоБулево - Строка
//   * ПравилоХранилищеЗначений - Строка
//   * ПравилоЧисло - Строка
//   * УдалятьФайлы - Булево
//   * ОчищатьПерсональныеНастройкиПользователей - Булево
//
Функция ПравилаОбработкиПоУмолчанию() Экспорт
	
	Правила = Новый Структура;
	Правила.Вставить("ПравилоСтрока", ЗначенияПравилОбработки().Очистить);
	Правила.Вставить("ПравилоДата", ЗначенияПравилОбработки().Очистить);
	Правила.Вставить("ПравилоБулево", ЗначенияПравилОбработки().НеИзменять);
	Правила.Вставить("ПравилоХранилищеЗначений", ЗначенияПравилОбработки().Очистить);
	Правила.Вставить("ПравилоЧисло", ЗначенияПравилОбработки().СлучайноеЗначение);
	Правила.Вставить("УдалятьФайлы", Истина);
	Правила.Вставить("ОчищатьПерсональныеНастройкиПользователей", Ложь);
	
	Возврат Правила;
	
КонецФункции

Функция ЗначенияПравилОбработки()
	
	Значения = Новый Структура;
	Значения.Вставить("Очистить", "Очистить");
	Значения.Вставить("СлучайноеЗначение", "СлучайноеЗначение");
	Значения.Вставить("НеИзменять", "НеИзменять");
	
	Возврат Значения;
	
КонецФункции

// Параметры отбора скрываемых данных.
// 
// Возвращаемое значение:
//  Структура - параметры отбора скрываемых данных:
//   * ОсновноеПолеОтбора - Строка
//   * Субъекты - Массив из ОпределяемыйТип.СубъектПерсональныхДанных
//
Функция ПараметрыОтбораУничтожаемыхДанных(Субъекты = Неопределено) Экспорт
	
	Если Субъекты = Неопределено Тогда
		Субъекты = Новый Массив; 
	КонецЕсли;
	
	Возврат Новый Структура("ОсновноеПолеОтбора,Субъекты", "", Субъекты);
	
КонецФункции

// Возвращаемое значение:
//  Структура - обрабатываемые метаданные:
//   * Константы - Строка
//   * Справочники - Строка
//   * Документы - Строка
//   * ПланыВидовХарактеристик - Строка
//   * ПланыСчетов - Строка
//   * ПланыВидовРасчета - Строка
//   * РегистрыСведений - Строка
//   * РегистрыНакопления - Строка
//   * РегистрыБухгалтерии - Строка
//   * РегистрыРасчета - Строка
//   * БизнесПроцессы - Строка
//   * Задачи - Строка
//
Функция ОбрабатываемыеМетаданные()
	
	Структура = Новый Структура;
	Структура.Вставить("Константы", НСтр("ru = 'Константы'"));
	Структура.Вставить("Справочники", НСтр("ru = 'Справочники'"));
	Структура.Вставить("Документы", НСтр("ru = 'Документы'"));
	Структура.Вставить("ПланыВидовХарактеристик", НСтр("ru = 'Планы видов характеристик'"));
	Структура.Вставить("ПланыСчетов", НСтр("ru = 'Планы счетов'"));
	Структура.Вставить("ПланыВидовРасчета", НСтр("ru = 'Планы видов расчета'"));
	Структура.Вставить("РегистрыСведений", НСтр("ru = 'Регистры сведений'"));
	Структура.Вставить("РегистрыНакопления", НСтр("ru = 'Регистры накопления'"));
	Структура.Вставить("РегистрыБухгалтерии", НСтр("ru = 'Регистры бухгалтерии'"));
	Структура.Вставить("РегистрыРасчета", НСтр("ru = 'Регистры расчета'"));
	Структура.Вставить("БизнесПроцессы", НСтр("ru = 'Бизнес процессы'"));
	Структура.Вставить("Задачи", НСтр("ru = 'Задачи'"));
	
	Возврат Структура;
	
КонецФункции

#Область ФормированияДереваМетаданных

// Возвращаемое значение:
//   см. НовоеДеревоОбрабатываемыхОбъектов
//
Функция ДеревоОбрабатываемыхОбъектов() Экспорт
	
	ДеревоОбрабатываемыхОбъектов = ЗащитаПерсональныхДанныхУничтожениеПовтИсп.ДеревоОбрабатываемыхОбъектовБезНастроек();
	УстановитьНастройкиВДеревеОбрабатываемыхОбъектов(ДеревоОбрабатываемыхОбъектов);
	
	Возврат ДеревоОбрабатываемыхОбъектов;
	
КонецФункции

// Возвращаемое значение:
//   см. НовоеДеревоОбрабатываемыхОбъектов
//
Функция ДеревоОбрабатываемыхОбъектовБезНастроек() Экспорт
	
	ОбрабатываемыеМетаданные = ОбрабатываемыеМетаданные();
	ДеревоОбрабатываемыхОбъектов = НовоеДеревоОбрабатываемыхОбъектов();

	РазделениеВключено = ОбщегоНазначения.РазделениеВключено();
	ДоступноИспользованиеРазделенныхДанных = ОбщегоНазначения.ДоступноИспользованиеРазделенныхДанных();
	
	КартинкиОбъектов = КартинкиОбъектов();
	УничтожаемыеОбъектыПоТипам = УничтожаемыеОбъекты();
	
	// Заполнение дерева объектов.
	Для Каждого ТипМетаданных Из ОбрабатываемыеМетаданные Цикл
		СтрокаДерева = ДеревоОбрабатываемыхОбъектов.Строки.Добавить();
		СтрокаДерева.Имя = ТипМетаданных.Ключ;
		СтрокаДерева.Представление = ТипМетаданных.Значение;
		СтрокаДерева.Картинка = КартинкиОбъектов[ТипМетаданных.Ключ];
		СтрокаДерева.ПолноеИмя = ЗащитаПерсональныхДанныхУничтожениеПовтИсп.ЭлементИмениПоТипуМетаданных(СтрокаДерева.Имя);
		
		СкрываемыеОбъекты = УничтожаемыеОбъектыПоТипам[ТипМетаданных.Ключ];
		ОбъектыМетаданных = Метаданные[ТипМетаданных.Ключ]; // Массив из ОбъектМетаданных
		Для Каждого ОбъектМетаданных Из ОбъектыМетаданных Цикл
			Если РазделениеВключено Тогда
				ПолноеИмя = СтрокаДерева.ПолноеИмя + "." + ОбъектМетаданных.Имя;
				
				Если ОбщегоНазначения.ПодсистемаСуществует("ТехнологияСервиса.БазоваяФункциональность") Тогда
					МодульРаботаВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("РаботаВМоделиСервиса");
					ЭтоРазделенныйОМД = МодульРаботаВМоделиСервиса.ЭтоРазделенныйОбъектМетаданных(ПолноеИмя);
				Иначе
					ЭтоРазделенныйОМД = Ложь;
				КонецЕсли;
				
				Если (ДоступноИспользованиеРазделенныхДанных И Не ЭтоРазделенныйОМД)
					Или (Не ДоступноИспользованиеРазделенныхДанных И ЭтоРазделенныйОМД) Тогда
					Продолжить;
				КонецЕсли;
			КонецЕсли;
			
			Если СкрываемыеОбъекты <> Неопределено
				И СкрываемыеОбъекты.Найти(ОбъектМетаданных.Имя) <> Неопределено Тогда
				Продолжить;
			КонецЕсли;
			ДобавитьОбъекты(ОбъектМетаданных, СтрокаДерева, ТипМетаданных, КартинкиОбъектов);
		КонецЦикла;
		
		СтрокаДерева.Строки.Сортировать("Представление Возр");
	КонецЦикла;
	
	Возврат ДеревоОбрабатываемыхОбъектов;
	
КонецФункции

// Возвращает новое дерево обрабатываемых объектов.
// 
// Возвращаемое значение:
//  ДеревоЗначений - новое дерево обрабатываемых объектов:
//   * Картинка - Картинка
//   * Имя - Строка
//   * Представление - Строка
//   * ПредставлениеПравилаОбработки - Строка
//   * Пометка - Число
//   * Тип - Строка
//   * ТипЗначения - ОписаниеТипов
//   * ПолноеИмя - Строка
//   * ПравилоОбработки - СписокЗначений
//   * КатегорияДанных - Строка
//   * ПроверкаЗаполнения - ПроверкаЗаполнения
//
Функция НовоеДеревоОбрабатываемыхОбъектов()
	
	ДеревоОбрабатываемыхОбъектов = Новый ДеревоЗначений;
	ДеревоОбрабатываемыхОбъектов.Колонки.Добавить("Картинка", Новый ОписаниеТипов("Картинка"));
	ДеревоОбрабатываемыхОбъектов.Колонки.Добавить("Имя", ОбщегоНазначения.ОписаниеТипаСтрока(0));
	ДеревоОбрабатываемыхОбъектов.Колонки.Добавить("Представление", ОбщегоНазначения.ОписаниеТипаСтрока(0));
	ДеревоОбрабатываемыхОбъектов.Колонки.Добавить("ПредставлениеПравилаОбработки", ОбщегоНазначения.ОписаниеТипаСтрока(0));
	ДеревоОбрабатываемыхОбъектов.Колонки.Добавить("Пометка", ОбщегоНазначения.ОписаниеТипаЧисло(1));
	ДеревоОбрабатываемыхОбъектов.Колонки.Добавить("Тип", ОбщегоНазначения.ОписаниеТипаСтрока(0));
	ДеревоОбрабатываемыхОбъектов.Колонки.Добавить("ТипЗначения", Новый ОписаниеТипов("ОписаниеТипов"));
	ДеревоОбрабатываемыхОбъектов.Колонки.Добавить("ПолноеИмя", ОбщегоНазначения.ОписаниеТипаСтрока(0));
	ДеревоОбрабатываемыхОбъектов.Колонки.Добавить("ПравилоОбработки", Новый ОписаниеТипов("СписокЗначений"));
	ДеревоОбрабатываемыхОбъектов.Колонки.Добавить("КатегорияДанных", Новый ОписаниеТипов("Строка"));
	ДеревоОбрабатываемыхОбъектов.Колонки.Добавить("ПроверкаЗаполнения", Новый ОписаниеТипов("ПроверкаЗаполнения"));
	
	Возврат ДеревоОбрабатываемыхОбъектов;
	
КонецФункции

// Картинки объектов.
// 
// Возвращаемое значение:
//  Соответствие из КлючИЗначение:
//   * Ключ - Строка
//   * Значение - Картинка
//
Функция КартинкиОбъектов()
	
	КартинкиОбъектов = Новый Соответствие;
	КартинкиОбъектов.Вставить("Константы", БиблиотекаКартинок.Константа);
	КартинкиОбъектов.Вставить("Справочники", БиблиотекаКартинок.Справочник);
	КартинкиОбъектов.Вставить("Документы", БиблиотекаКартинок.Документ);
	КартинкиОбъектов.Вставить("ПланыВидовХарактеристик", БиблиотекаКартинок.ПланВидовХарактеристик);
	КартинкиОбъектов.Вставить("ПланыСчетов", БиблиотекаКартинок.ПланСчетов);
	КартинкиОбъектов.Вставить("ПланыВидовРасчета", БиблиотекаКартинок.ПланВидовРасчета);
	КартинкиОбъектов.Вставить("РегистрыСведений", БиблиотекаКартинок.РегистрСведений);
	КартинкиОбъектов.Вставить("РегистрыНакопления", БиблиотекаКартинок.РегистрНакопления);
	КартинкиОбъектов.Вставить("РегистрыБухгалтерии", БиблиотекаКартинок.РегистрБухгалтерии);
	КартинкиОбъектов.Вставить("РегистрыРасчета", БиблиотекаКартинок.РегистрРасчета);
	КартинкиОбъектов.Вставить("БизнесПроцессы", БиблиотекаКартинок.БизнесПроцесс);
	КартинкиОбъектов.Вставить("Задачи", БиблиотекаКартинок.Задача);
	КартинкиОбъектов.Вставить("Реквизиты", БиблиотекаКартинок.Реквизит);
	КартинкиОбъектов.Вставить("СтандартныеРеквизиты", БиблиотекаКартинок.Реквизит);
	КартинкиОбъектов.Вставить("ТабличнаяЧасть", БиблиотекаКартинок.ВложеннаяТаблица);
	КартинкиОбъектов.Вставить("Ресурсы", БиблиотекаКартинок.Ресурс);
	КартинкиОбъектов.Вставить("Измерения", БиблиотекаКартинок.Измерение);
	
	Возврат КартинкиОбъектов;
	
КонецФункции

// Возвращаемое значение:
//  Соответствие из КлючИЗначение:
//   * Ключ - Строка
//   * Значение - Массив из Строка
//
Функция УничтожаемыеОбъекты()
	
	УничтожаемыеРегистрыСведений = Новый Массив; // Массив из Строка
	УничтожаемыеРегистрыСведений.Добавить("ВерсииПодсистем");
	УничтожаемыеРегистрыСведений.Добавить("ВерсииПодсистемОбластейДанных");
	УничтожаемыеРегистрыСведений.Добавить("ВерсииОбъектов");
	
	УничтожаемыеСправочники = Новый Массив; // Массив из Строка
	УничтожаемыеСправочники.Добавить("ИдентификаторыОбъектовМетаданных");
	УничтожаемыеСправочники.Добавить("ИдентификаторыОбъектовРасширений");
	
	УничтожаемыеКонстанты = Новый Массив; // Массив из Строка
	УничтожаемыеКонстанты.Добавить("ОтложенноеОбновлениеЗавершеноУспешно");
	УничтожаемыеКонстанты.Добавить("СведенияОБлокируемыхОбъектах");
	УничтожаемыеКонстанты.Добавить("СведенияОбОбновленииИБ");
	
	УничтожаемыеОбъектыПоТипам = Новый Соответствие;
	УничтожаемыеОбъектыПоТипам.Вставить("РегистрыСведений", УничтожаемыеРегистрыСведений);
	УничтожаемыеОбъектыПоТипам.Вставить("Справочники", УничтожаемыеСправочники);
	УничтожаемыеОбъектыПоТипам.Вставить("Константы", УничтожаемыеКонстанты);
	
	Возврат УничтожаемыеОбъектыПоТипам;
	
КонецФункции

// Параметры:
//  ТипМетаданных - Строка - тип метаданных
// 
// Возвращаемое значение:
//  Произвольный, Строка - элемент имени по типу метаданных
//
Функция ЭлементИмениПоТипуМетаданных(ТипМетаданных) Экспорт
	
	Соответствие = Новый Соответствие;
	Соответствие.Вставить("Константы", "Константа");
	Соответствие.Вставить("Справочники", "Справочник");
	Соответствие.Вставить("Документы", "Документ");
	Соответствие.Вставить("ПланыВидовХарактеристик", "ПланВидовХарактеристик");
	Соответствие.Вставить("ПланыСчетов", "ПланСчетов");
	Соответствие.Вставить("ПланыВидовРасчета", "ПланВидовРасчета");
	Соответствие.Вставить("РегистрыСведений", "РегистрСведений");
	Соответствие.Вставить("РегистрыНакопления", "РегистрНакопления");
	Соответствие.Вставить("РегистрыБухгалтерии", "РегистрБухгалтерии");
	Соответствие.Вставить("РегистрыРасчета", "РегистрРасчета");
	Соответствие.Вставить("БизнесПроцессы", "БизнесПроцесс");
	Соответствие.Вставить("Задачи", "Задача");
	
	Возврат Соответствие[ТипМетаданных];
	
КонецФункции

// Параметры:
//   ОбъектМетаданных - ОбъектМетаданных
//   СтрокаДерева - СтрокаДереваЗначений:
//   * Имя - Строка
//   ТипМетаданных - Структура
//   КартинкиОбъектов - см. КартинкиОбъектов
//
Процедура ДобавитьОбъекты(ОбъектМетаданных, СтрокаДерева, ТипМетаданных, КартинкиОбъектов)
	
	Если ТипМетаданных.Ключ = "Константы" Тогда
		Если Не ДопустимыйТип(ОбъектМетаданных.Тип) Тогда
			Возврат;
		КонецЕсли;
		
		СтрокаОбъект = СтрокаДерева.Строки.Добавить();
		СтрокаОбъект.Имя           = ОбъектМетаданных.Имя;
		СтрокаОбъект.Представление = ОбъектМетаданных.Синоним + ПредставлениеТиповСвойства(ОбъектМетаданных.Тип);
		СтрокаОбъект.Картинка      = КартинкиОбъектов[ТипМетаданных.Ключ];
		СтрокаОбъект.Тип           = ТипМетаданных.Ключ;
		СтрокаОбъект.ТипЗначения   = ОбъектМетаданных.Тип;
		СтрокаОбъект.ПолноеИмя     = СтрокаДерева.ПолноеИмя + "." + СтрокаОбъект.Имя;
		СтрокаОбъект.ПредставлениеПравилаОбработки = НСтр("ru = 'По умолчанию'");
		
	Иначе
		ЕстьОбрабатываемыеСвойства = Ложь;
		
		СтрокаОбъект = СтрокаДерева.Строки.Добавить();
		СтрокаОбъект.Имя           = ОбъектМетаданных.Имя;
		СтрокаОбъект.Представление = ОбъектМетаданных.Синоним;
		СтрокаОбъект.Картинка      = КартинкиОбъектов[ТипМетаданных.Ключ];
		СтрокаОбъект.Тип           = ТипМетаданных.Ключ;
		СтрокаОбъект.ПолноеИмя     = СтрокаДерева.ПолноеИмя + "." + СтрокаОбъект.Имя;
		СтрокаОбъект.ТипЗначения   = ОписаниеТипаОбъекта(СтрокаДерева.ПолноеИмя, СтрокаОбъект.Имя);
		
		ЭтоРегистр = (СтрНайти(ТипМетаданных.Ключ, "Регистры") > 0);
		// Добавление стандартных реквизитов.
		ДобавитьСвойства(ОбъектМетаданных, СтрокаОбъект, "СтандартныеРеквизиты", ЕстьОбрабатываемыеСвойства,
			КартинкиОбъектов);
		// Добавление реквизитов.
		ДобавитьСвойства(ОбъектМетаданных, СтрокаОбъект, "Реквизиты", ЕстьОбрабатываемыеСвойства, КартинкиОбъектов);
		
		Если Не ЭтоРегистр Тогда
			Для Каждого ТабличнаяЧасть Из ОбъектМетаданных.ТабличныеЧасти Цикл
				ДобавитьСвойства(ТабличнаяЧасть, СтрокаОбъект, "ТабличнаяЧасть", ЕстьОбрабатываемыеСвойства,
					КартинкиОбъектов);
			КонецЦикла;
		Иначе
			ДобавитьСвойства(ОбъектМетаданных, СтрокаОбъект, "Ресурсы", ЕстьОбрабатываемыеСвойства, КартинкиОбъектов);
			ДобавитьСвойства(ОбъектМетаданных, СтрокаОбъект, "Измерения", ЕстьОбрабатываемыеСвойства, КартинкиОбъектов);
		КонецЕсли;
		
		Если ТипМетаданных.Ключ = "ПланыСчетов" Тогда
			ДобавитьСвойства(ОбъектМетаданных, СтрокаОбъект, "ПризнакиУчета", ЕстьОбрабатываемыеСвойства,
				КартинкиОбъектов);
		КонецЕсли;
		
		Если Не ЕстьОбрабатываемыеСвойства Тогда
			СтрокаДерева.Строки.Удалить(СтрокаОбъект); // У объекта нет реквизитов, которые можно обработать.
		КонецЕсли;
	КонецЕсли;
	
КонецПроцедуры

Функция ДопустимыйТип(ТипЗначения)
	
	Если ТипЗначения.СодержитТип(Тип("Строка"))
		Или ТипЗначения.СодержитТип(Тип("Булево"))
		Или ТипЗначения.СодержитТип(Тип("Число"))
		Или ТипЗначения.СодержитТип(Тип("Дата"))
		Или ТипЗначения.СодержитТип(Тип("ХранилищеЗначения")) Тогда
		Возврат Истина;
	Иначе
		Возврат Ложь;
	КонецЕсли;
	
КонецФункции

Функция ПредставлениеТиповСвойства(ТипЗначения)
	МассивТипов = ТипЗначения.Типы();
	Представление = "";
	Для Каждого Тип Из МассивТипов Цикл
		Если Представление = "" Тогда
			Представление = Строка(Тип);
		Иначе
			Представление = Представление + ", " + Строка(Тип);
		КонецЕсли;
	КонецЦикла;
	
	Представление = " (" + Представление + ")";
	
	Возврат Представление;
КонецФункции

Функция ОписаниеТипаОбъекта(КлассОМ, ИмяОбъекта)
	
	Если ВРег(КлассОМ) = "ПЛАНОБМЕНА" Тогда
		Менеджер = ПланыОбмена;
		
	ИначеЕсли ВРег(КлассОМ) = "СПРАВОЧНИК" Тогда
		Менеджер = Справочники;
		
	ИначеЕсли ВРег(КлассОМ) = "ДОКУМЕНТ" Тогда
		Менеджер = Документы;
		
	ИначеЕсли ВРег(КлассОМ) = "ЖУРНАЛДОКУМЕНТОВ" Тогда
		Менеджер = ЖурналыДокументов;
		
	ИначеЕсли ВРег(КлассОМ) = "ПЕРЕЧИСЛЕНИЕ" Тогда
		Менеджер = Перечисления;
		
	ИначеЕсли ВРег(КлассОМ) = "ПЛАНВИДОВХАРАКТЕРИСТИК" Тогда
		Менеджер = ПланыВидовХарактеристик;
		
	ИначеЕсли ВРег(КлассОМ) = "ПЛАНСЧЕТОВ" Тогда
		Менеджер = ПланыСчетов;
		
	ИначеЕсли ВРег(КлассОМ) = "ПЛАНВИДОВРАСЧЕТА" Тогда
		Менеджер = ПланыВидовРасчета;
		
	ИначеЕсли ВРег(КлассОМ) = "БИЗНЕСПРОЦЕСС" Тогда
		Менеджер = БизнесПроцессы;
		
	ИначеЕсли ВРег(КлассОМ) = "ЗАДАЧА" Тогда
		Менеджер = Задачи;
		
	Иначе
		Менеджер = Неопределено;
	КонецЕсли;
	
	Если Менеджер <> Неопределено Тогда
		Массив = Новый Массив;
		Массив.Добавить(ТипЗнч(Менеджер[ИмяОбъекта].ПустаяСсылка()));
		Возврат Новый ОписаниеТипов(Массив);
	КонецЕсли;
	
	Возврат Неопределено;
	
КонецФункции

Процедура ДобавитьСвойства(ОбъектМетаданных, СтрокаДерева, Тип, ЕстьОбрабатываемыеСвойства, КартинкиОбъектов)
	
	Если Тип = "СтандартныеРеквизиты" Тогда
		Имя = Тип;
		Синоним = НСтр("ru = 'Стандартные реквизиты'");
		Коллекция = ОбъектМетаданных[Тип];
	ИначеЕсли Тип = "ТабличнаяЧасть" Тогда
		Имя   = ОбъектМетаданных.Имя;
		Синоним = ОбъектМетаданных.Синоним;
		Коллекция = ОбъектМетаданных.Реквизиты;
	Иначе
		Имя = Тип;
		Если Тип = "ПризнакиУчета" Тогда
			Синоним = НСтр("ru = 'Признаки учета'");
		Иначе
			Синоним = Тип;
		КонецЕсли;
		Коллекция = ОбъектМетаданных[Тип];
	КонецЕсли;
	
	СтрокаЭлементовДобавлена = Ложь;
	Для Каждого ЭлементКоллекции Из Коллекция Цикл
		
		Если Тип = "СтандартныеРеквизиты" И ЭлементКоллекции.Имя <> "Наименование" Тогда
			Продолжить;
		КонецЕсли;
		
		Если Не ДопустимыйТип(ЭлементКоллекции.Тип) Тогда
			Продолжить;
		КонецЕсли;
		
		Если Не СтрокаЭлементовДобавлена Тогда
			СтрокаЭлементов = СтрокаДерева.Строки.Добавить();
			СтрокаЭлементов.Имя           = Имя;
			СтрокаЭлементов.Представление = Синоним;
			СтрокаЭлементов.Картинка      = КартинкиОбъектов[Тип];
			СтрокаЭлементов.ПолноеИмя     = СтрокаДерева.ПолноеИмя + "." + Имя;
			СтрокаЭлементов.Тип = ?(Тип = "ТабличнаяЧасть", Тип, "");
			СтрокаЭлементовДобавлена = Истина;
		КонецЕсли;
		
		ТипОбъекта = ?(Тип = "ТабличнаяЧасть", "РеквизитТабличнойЧасти", Тип);
		Если ТипОбъекта = "Ресурсы" И СтрокаДерева.Тип = "РегистрыБухгалтерии" И ЭлементКоллекции.Балансовый Тогда
			ТипОбъекта = ТипОбъекта + "Балансовый";
		КонецЕсли;
		
		ПредставлениеСвойства = ?(ЭлементКоллекции.Синоним = "", ЭлементКоллекции.Имя, ЭлементКоллекции.Синоним);
		
		СтрокаСвойство = СтрокаЭлементов.Строки.Добавить();
		СтрокаСвойство.Имя           = ЭлементКоллекции.Имя;
		СтрокаСвойство.Представление = ПредставлениеСвойства + ПредставлениеТиповСвойства(ЭлементКоллекции.Тип);
		СтрокаСвойство.Картинка      = КартинкиОбъектов[ТипОбъекта];
		СтрокаСвойство.Тип           = ТипОбъекта;
		СтрокаСвойство.ТипЗначения   = ЭлементКоллекции.Тип;
		СтрокаСвойство.ПолноеИмя     = СтрокаЭлементов.ПолноеИмя + "." + ЭлементКоллекции.Имя;
		СтрокаСвойство.ПредставлениеПравилаОбработки = НСтр("ru = 'По умолчанию'");
		
		Если Тип = "СтандартныеРеквизиты" И ЭлементКоллекции.Имя = "Наименование" Тогда
			СтрокаСвойство.ПроверкаЗаполнения = ПроверкаЗаполнения.ВыдаватьОшибку;
		Иначе
			СтрокаСвойство.ПроверкаЗаполнения = ЭлементКоллекции.ПроверкаЗаполнения;
		КонецЕсли;
		
		ЕстьОбрабатываемыеСвойства = Истина;
		
	КонецЦикла;
	
КонецПроцедуры

Процедура УстановитьНастройкиВДеревеОбрабатываемыхОбъектов(ДеревоОбрабатываемыхОбъектов,
	УничтожаемыеДанные = Неопределено) Экспорт
	
	Если УничтожаемыеДанные = Неопределено Тогда
		УничтожаемыеДанные = ЗащитаПерсональныхДанных.УничтожаемыеПерсональныеДанные();
	КонецЕсли;
	
	Для Каждого СтрокаСведения Из УничтожаемыеДанные Цикл
		
		ПолноеИмяОбъекта = СтрокаСведения.Объект;
		СтрокаОбъекта = ДеревоОбрабатываемыхОбъектов.Строки.Найти(ПолноеИмяОбъекта, "ПолноеИмя", Истина);
		Если СтрокаОбъекта = Неопределено Тогда
			Продолжить;
		КонецЕсли;
		
		Поля = СтрокаСведения.Поля;
		Если ТипЗнч(Поля) = Тип("Массив") Тогда
			МассивПолей = Поля;
		ИначеЕсли ТипЗнч(Поля) = Тип("Строка") Тогда
			МассивПолей = СтрРазделить(Поля, ",");
		Иначе
			ОбщегоНазначенияКлиентСервер.Проверить(Ложь, СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
				НСтр("ru = 'Не известный тип значения описания полей уничтожаемых персональных данных для объекта %1'"),
					ПолноеИмяОбъекта),
				"Обработки.СкрытиеКонфиденциальнойИнформации.УстановитьНастройкиВДеревеОбрабатываемыхОбъектов");
		КонецЕсли;
		
		Для Каждого Поле Из МассивПолей Цикл
			
			ИмяПоля = ЗащитаПерсональныхДанныхПовтИсп.КраткоеИмяПоля(Поле, ПолноеИмяОбъекта);
			ЧастиИмениПоляДоступа = СтрРазделить(ИмяПоля, ".");
			
			Если ЧастиИмениПоляДоступа.Количество() > 1 Тогда
				СтрокаТЧ = СтрокаОбъекта.Строки.Найти(ЧастиИмениПоляДоступа[0], "Имя", Истина);
				Если СтрокаТЧ = Неопределено Тогда
					СтрокаПолеДоступа = Неопределено;
					Продолжить;
				Иначе
					СтрокаПолеДоступа = СтрокаТЧ.Строки.Найти(ЧастиИмениПоляДоступа[1], "Имя", Истина);
				КонецЕсли;
			Иначе
				СтрокаПолеДоступа = СтрокаОбъекта.Строки.Найти(ИмяПоля, "Имя", Истина);
			КонецЕсли;
			
			Если СтрокаПолеДоступа <> Неопределено Тогда
				СтрокаПолеДоступа.Пометка = 1;
				СтрокаПолеДоступа.КатегорияДанных = СтрокаСведения.КатегорияДанных;
			КонецЕсли;
			
		КонецЦикла;
		
	КонецЦикла;

	ОбновитьФлажки(ДеревоОбрабатываемыхОбъектов);
	
КонецПроцедуры

Процедура ОбновитьФлажки(ДеревоОбрабатываемыхОбъектов)
	
	Для Каждого ОбрабатываемыйОбъект Из ДеревоОбрабатываемыхОбъектов.Строки Цикл
		ОбновитьФлажкиДерева(ОбрабатываемыйОбъект);
	КонецЦикла;
	
КонецПроцедуры

Процедура ОбновитьФлажкиДерева(Родитель)
	
	ДочерниеЭлементы = Родитель.Строки;
	ПометкаРодителя = Неопределено;
	
	Для Каждого СтрокаДерева Из ДочерниеЭлементы Цикл
		Если СтрокаДерева.Строки.Количество() > 0 Тогда
			ОбновитьФлажкиДерева(СтрокаДерева);
		Иначе
			Возврат;
		КонецЕсли;
		
		ЕстьОтмеченные   = Ложь;
		ЕстьНеОтмеченные = Ложь;
		ЕстьПолуотмеченные = Ложь;
		Для Каждого Элемент Из СтрокаДерева.Строки Цикл
			ЕстьОтмеченные = ЕстьОтмеченные Или (Элемент.Пометка = 1);
			ЕстьНеОтмеченные = ЕстьНеОтмеченные Или (Элемент.Пометка = 0);
			ЕстьПолуотмеченные = ЕстьПолуотмеченные Или (Элемент.Пометка = 2);
		КонецЦикла;
		
		Если ЕстьНеОтмеченные И Не ЕстьОтмеченные И Не ЕстьПолуотмеченные Тогда
			СтрокаДерева.Пометка = 0;
			Если ПометкаРодителя = 1 Тогда
				ПометкаРодителя = 2;
			КонецЕсли;
		ИначеЕсли ЕстьОтмеченные И Не ЕстьНеОтмеченные И Не ЕстьПолуотмеченные Тогда
			СтрокаДерева.Пометка = 1;
			Если ПометкаРодителя = 0 Тогда
				ПометкаРодителя = 2;
			КонецЕсли;
		Иначе
			СтрокаДерева.Пометка = 2;
			ПометкаРодителя = 2;
		КонецЕсли;
		
		Если ПометкаРодителя = Неопределено Тогда
			ПометкаРодителя = СтрокаДерева.Пометка;
		КонецЕсли;
	КонецЦикла;
	
	Родитель.Пометка = ПометкаРодителя;
	
КонецПроцедуры

#КонецОбласти

#КонецОбласти

#КонецЕсли